{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from keras.models import Sequential\n",
    "from keras.callbacks import Callback\n",
    "from keras.layers import Conv2D, MaxPooling2D, Dropout, Dense, Flatten, UpSampling2D\n",
    "from keras import backend as K\n",
    "\n",
    "import random\n",
    "import glob\n",
    "import wandb\n",
    "from wandb.keras import WandbCallback\n",
    "import subprocess\n",
    "import os\n",
    "from PIL import Image\n",
    "import numpy as np\n",
    "from matplotlib.pyplot import imshow, figure\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W&B Run: https://app.wandb.ai/l2k2/ml-class-examples_keras-video-predict/runs/cje1n44s\n",
      "Call `%%wandb` in the cell containing your training loop to display live results.\n"
     ]
    }
   ],
   "source": [
    "#initialize wandb and download dataset\n",
    "\n",
    "hyperparams = {\"num_epochs\": 10, \n",
    "          \"batch_size\": 32,\n",
    "          \"height\": 96,\n",
    "          \"width\": 96}\n",
    "\n",
    "wandb.init(config=hyperparams)\n",
    "config = wandb.config\n",
    "\n",
    "val_dir = 'catz/test'\n",
    "train_dir = 'catz/train'\n",
    "\n",
    "# automatically get the data if it doesn't exist\n",
    "if not os.path.exists(\"catz\"):\n",
    "    print(\"Downloading catz dataset...\")\n",
    "    subprocess.check_output(\n",
    "        \"curl https://storage.googleapis.com/wandb/catz.tar.gz | tar xz\", shell=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# generator to loop over train and test images\n",
    "\n",
    "def my_generator(batch_size, img_dir):\n",
    "    \"\"\"A generator that returns 5 images plus a result image\"\"\"\n",
    "    cat_dirs = glob.glob(img_dir + \"/*\")\n",
    "    counter = 0\n",
    "    while True:\n",
    "        input_images = np.zeros(\n",
    "            (batch_size, config.width, config.height, 3 * 5))\n",
    "        output_images = np.zeros((batch_size, config.width, config.height, 3))\n",
    "        random.shuffle(cat_dirs)\n",
    "        if (counter+batch_size >= len(cat_dirs)):\n",
    "            counter = 0\n",
    "        for i in range(batch_size):\n",
    "            input_imgs = glob.glob(cat_dirs[counter + i] + \"/cat_[0-5]*\")\n",
    "            imgs = [Image.open(img) for img in sorted(input_imgs)]\n",
    "            input_images[i] = np.concatenate(imgs, axis=2)\n",
    "            output_images[i] = np.array(Image.open(\n",
    "                cat_dirs[counter + i] + \"/cat_result.jpg\"))\n",
    "            input_images[i] /= 255.\n",
    "            output_images[i] /= 255.\n",
    "        yield (input_images, output_images)\n",
    "        counter += batch_size\n",
    "        \n",
    "steps_per_epoch = len(glob.glob(train_dir + \"/*\")) // config.batch_size\n",
    "validation_steps = len(glob.glob(val_dir + \"/*\")) // config.batch_size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#callback to log the images\n",
    "\n",
    "class ImageCallback(Callback):\n",
    "    def on_epoch_end(self, epoch, logs):\n",
    "        validation_X, validation_y = next(\n",
    "            my_generator(15, val_dir))\n",
    "        output = self.model.predict(validation_X)\n",
    "        wandb.log({\n",
    "            \"input\": [wandb.Image(np.concatenate(np.split(c, 5, axis=2), axis=1)) for c in validation_X],\n",
    "            \"output\": [wandb.Image(np.concatenate([validation_y[i], o], axis=1)) for i, o in enumerate(output)]\n",
    "        }, commit=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(96, 96, 3)"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Test the generator\n",
    "gen = my_generator(2, train_dir)\n",
    "videos, next_frame = next(gen)\n",
    "videos[0].shape\n",
    "next_frame[0].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7fb04f5b7a90>"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "figure()\n",
    "imshow(videos[0][:,:,0:3])\n",
    "figure()\n",
    "imshow(videos[0][:,:,3:6])\n",
    "figure()\n",
    "imshow(videos[0][:,:,6:9])\n",
    "figure()\n",
    "imshow(videos[0][:,:,9:12])\n",
    "\n",
    "figure()\n",
    "imshow(next_frame[0][:,:,0:3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Function for measuring how similar two images are\n",
    "def perceptual_distance(y_true, y_pred):\n",
    "    y_true *= 255.\n",
    "    y_pred *= 255.\n",
    "    rmean = (y_true[:, :, :, 0] + y_pred[:, :, :, 0]) / 2\n",
    "    r = y_true[:, :, :, 0] - y_pred[:, :, :, 0]\n",
    "    g = y_true[:, :, :, 1] - y_pred[:, :, :, 1]\n",
    "    b = y_true[:, :, :, 2] - y_pred[:, :, :, 2]\n",
    "\n",
    "    return K.mean(K.sqrt((((512+rmean)*r*r)/256) + 4*g*g + (((767-rmean)*b*b)/256)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W&B Run: https://app.wandb.ai/l2k2/ml-class-examples_keras-video-predict/runs/ne93ynbj\n",
      "Call `%%wandb` in the cell containing your training loop to display live results.\n",
      "Epoch 1/10\n",
      "52/52 [==============================] - 10s 186ms/step - loss: 0.0491 - perceptual_distance: 138.4108 - val_loss: 0.0190 - val_perceptual_distance: 76.8124\n",
      "Epoch 2/10\n",
      "52/52 [==============================] - 9s 170ms/step - loss: 0.0157 - perceptual_distance: 66.7613 - val_loss: 0.0138 - val_perceptual_distance: 60.2717\n",
      "Epoch 3/10\n",
      "52/52 [==============================] - 10s 186ms/step - loss: 0.0138 - perceptual_distance: 58.4320 - val_loss: 0.0125 - val_perceptual_distance: 56.8256\n",
      "Epoch 4/10\n",
      "52/52 [==============================] - 10s 189ms/step - loss: 0.0120 - perceptual_distance: 53.2015 - val_loss: 0.0103 - val_perceptual_distance: 48.9738\n",
      "Epoch 5/10\n",
      "52/52 [==============================] - 10s 192ms/step - loss: 0.0099 - perceptual_distance: 47.9817 - val_loss: 0.0086 - val_perceptual_distance: 44.2460\n",
      "Epoch 6/10\n",
      "52/52 [==============================] - 10s 188ms/step - loss: 0.0086 - perceptual_distance: 43.3613 - val_loss: 0.0091 - val_perceptual_distance: 42.4493\n",
      "Epoch 7/10\n",
      "52/52 [==============================] - 10s 187ms/step - loss: 0.0100 - perceptual_distance: 44.8281 - val_loss: 0.0084 - val_perceptual_distance: 40.9105\n",
      "Epoch 8/10\n",
      "52/52 [==============================] - 10s 186ms/step - loss: 0.0084 - perceptual_distance: 41.2744 - val_loss: 0.0082 - val_perceptual_distance: 39.9885\n",
      "Epoch 9/10\n",
      "52/52 [==============================] - 10s 186ms/step - loss: 0.0076 - perceptual_distance: 38.7134 - val_loss: 0.0068 - val_perceptual_distance: 37.2396\n",
      "Epoch 10/10\n",
      "52/52 [==============================] - 10s 189ms/step - loss: 0.0074 - perceptual_distance: 37.5170 - val_loss: 0.0063 - val_perceptual_distance: 35.2135\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<keras.callbacks.History at 0x7fb04f5e3e10>"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wandb.init(config=hyperparams)\n",
    "config = wandb.config\n",
    "\n",
    "model = Sequential()\n",
    "model.add(Conv2D(3, (3, 3), activation='relu', padding='same', input_shape=(config.height, config.width, 5 * 3)))\n",
    "\n",
    "model.compile(optimizer='adam', loss='mse', metrics=[perceptual_distance])\n",
    "\n",
    "model.fit_generator(my_generator(config.batch_size, train_dir),\n",
    "                    steps_per_epoch=steps_per_epoch//4,\n",
    "                    epochs=config.num_epochs, callbacks=[\n",
    "    ImageCallback(), WandbCallback()],\n",
    "    validation_steps=validation_steps//4,\n",
    "    validation_data=my_generator(config.batch_size, val_dir))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W&B Run: https://app.wandb.ai/l2k2/ml-class-examples_keras-video-predict/runs/2s4jh01s\n",
      "Call `%%wandb` in the cell containing your training loop to display live results.\n",
      "Epoch 1/10\n",
      "52/52 [==============================] - 11s 205ms/step - loss: 0.0056 - perceptual_distance: 20.8150 - val_loss: 0.0040 - val_perceptual_distance: 17.8912\n",
      "Epoch 2/10\n",
      "52/52 [==============================] - 9s 169ms/step - loss: 0.0051 - perceptual_distance: 20.0967 - val_loss: 0.0058 - val_perceptual_distance: 21.1593\n",
      "Epoch 3/10\n",
      "52/52 [==============================] - 10s 195ms/step - loss: 0.0055 - perceptual_distance: 20.2913 - val_loss: 0.0044 - val_perceptual_distance: 18.0047\n",
      "Epoch 4/10\n",
      "52/52 [==============================] - 10s 191ms/step - loss: 0.0062 - perceptual_distance: 21.6678 - val_loss: 0.0056 - val_perceptual_distance: 20.6382\n",
      "Epoch 5/10\n",
      "52/52 [==============================] - 10s 197ms/step - loss: 0.0053 - perceptual_distance: 19.8640 - val_loss: 0.0046 - val_perceptual_distance: 18.3739\n",
      "Epoch 6/10\n",
      "52/52 [==============================] - 10s 188ms/step - loss: 0.0059 - perceptual_distance: 21.2223 - val_loss: 0.0043 - val_perceptual_distance: 18.0448\n",
      "Epoch 7/10\n",
      "52/52 [==============================] - 10s 192ms/step - loss: 0.0060 - perceptual_distance: 21.6186 - val_loss: 0.0051 - val_perceptual_distance: 19.6750\n",
      "Epoch 8/10\n",
      "52/52 [==============================] - 10s 194ms/step - loss: 0.0063 - perceptual_distance: 20.8991 - val_loss: 0.0057 - val_perceptual_distance: 21.1382\n",
      "Epoch 9/10\n",
      "52/52 [==============================] - 10s 195ms/step - loss: 0.0051 - perceptual_distance: 19.7828 - val_loss: 0.0049 - val_perceptual_distance: 19.3690\n",
      "Epoch 10/10\n",
      "16/52 [========>.....................] - ETA: 8s - loss: 0.0053 - perceptual_distance: 20.6880"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-85-07bd85b48307>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     21\u001b[0m     ImageCallback(), WandbCallback()],\n\u001b[1;32m     22\u001b[0m     \u001b[0mvalidation_steps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidation_steps\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m     validation_data=my_generator(config.batch_size, val_dir))\n\u001b[0m",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     89\u001b[0m                 warnings.warn('Update your `' + object_name + '` call to the ' +\n\u001b[1;32m     90\u001b[0m                               'Keras 2 API: ' + signature, stacklevel=2)\n\u001b[0;32m---> 91\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     92\u001b[0m         \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     93\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m   1416\u001b[0m             \u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1417\u001b[0m             \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1418\u001b[0;31m             initial_epoch=initial_epoch)\n\u001b[0m\u001b[1;32m   1419\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1420\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0minterfaces\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegacy_generator_methods_support\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training_generator.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m    179\u001b[0m             \u001b[0mbatch_index\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    180\u001b[0m             \u001b[0;32mwhile\u001b[0m \u001b[0msteps_done\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 181\u001b[0;31m                 \u001b[0mgenerator_output\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutput_generator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    183\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgenerator_output\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'__len__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/utils/data_utils.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    683\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    684\u001b[0m             \u001b[0;32mwhile\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_running\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 685\u001b[0;31m                 \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblock\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    686\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtask_done\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    687\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    662\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    663\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 664\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    665\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mready\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    666\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    659\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    660\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 661\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    662\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    663\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    549\u001b[0m             \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_flag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    550\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 551\u001b[0;31m                 \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    552\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    293\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m    \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    294\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 295\u001b[0;31m                 \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    296\u001b[0m                 \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    297\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# Baseline model - just return the last layer\n",
    "\n",
    "from keras.layers import Lambda, Reshape, Permute\n",
    "\n",
    "def slice(x):\n",
    "    return x[:,:,:,:, -1]\n",
    "\n",
    "wandb.init(config=hyperparams)\n",
    "config = wandb.config\n",
    "\n",
    "model=Sequential()\n",
    "model.add(Reshape((96,96,5,3), input_shape=(config.height, config.width, 5 * 3)))\n",
    "model.add(Permute((1,2,4,3)))\n",
    "model.add(Lambda(slice, input_shape=(96,96,3,5), output_shape=(96,96,3)))\n",
    "\n",
    "model.compile(optimizer='adam', loss='mse', metrics=[perceptual_distance])\n",
    "\n",
    "model.fit_generator(my_generator(config.batch_size, train_dir),\n",
    "                    steps_per_epoch=steps_per_epoch//4,\n",
    "                    epochs=config.num_epochs, callbacks=[\n",
    "    ImageCallback(), WandbCallback()],\n",
    "    validation_steps=validation_steps//4,\n",
    "    validation_data=my_generator(config.batch_size, val_dir))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W&B Run: https://app.wandb.ai/l2k2/ml-class-examples_keras-video-predict/runs/sgrxxlo6\n",
      "Call `%%wandb` in the cell containing your training loop to display live results.\n",
      "Epoch 1/10\n",
      "52/52 [==============================] - 10s 198ms/step - loss: 0.0055 - perceptual_distance: 20.1021 - val_loss: 0.0049 - val_perceptual_distance: 19.9001\n",
      "Epoch 2/10\n",
      "35/52 [===================>..........] - ETA: 2s - loss: 0.0057 - perceptual_distance: 21.3775"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-86-d90819d142aa>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     23\u001b[0m     ImageCallback(), WandbCallback()],\n\u001b[1;32m     24\u001b[0m     \u001b[0mvalidation_steps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidation_steps\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 25\u001b[0;31m     validation_data=my_generator(config.batch_size, val_dir))\n\u001b[0m",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     89\u001b[0m                 warnings.warn('Update your `' + object_name + '` call to the ' +\n\u001b[1;32m     90\u001b[0m                               'Keras 2 API: ' + signature, stacklevel=2)\n\u001b[0;32m---> 91\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     92\u001b[0m         \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     93\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m   1416\u001b[0m             \u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1417\u001b[0m             \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1418\u001b[0;31m             initial_epoch=initial_epoch)\n\u001b[0m\u001b[1;32m   1419\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1420\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0minterfaces\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegacy_generator_methods_support\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training_generator.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m    179\u001b[0m             \u001b[0mbatch_index\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    180\u001b[0m             \u001b[0;32mwhile\u001b[0m \u001b[0msteps_done\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 181\u001b[0;31m                 \u001b[0mgenerator_output\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutput_generator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    183\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgenerator_output\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'__len__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/utils/data_utils.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    683\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    684\u001b[0m             \u001b[0;32mwhile\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_running\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 685\u001b[0;31m                 \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblock\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    686\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtask_done\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    687\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    662\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    663\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 664\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    665\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mready\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    666\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    659\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    660\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 661\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    662\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    663\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    549\u001b[0m             \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_flag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    550\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 551\u001b[0;31m                 \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    552\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    293\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m    \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    294\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 295\u001b[0;31m                 \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    296\u001b[0m                 \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    297\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# Just return the last layer, functional style\n",
    "\n",
    "from keras.layers import Lambda, Reshape, Permute, Input\n",
    "from keras.models import Model\n",
    "\n",
    "def slice(x):\n",
    "    return x[:,:,:,:, -1]\n",
    "\n",
    "wandb.init(config=hyperparams)\n",
    "config = wandb.config\n",
    "\n",
    "inp = Input((config.height, config.width, 5 * 3))\n",
    "reshaped = Reshape((96,96,5,3))(inp)\n",
    "permuted = Permute((1,2,4,3))(reshaped)\n",
    "last_layer = Lambda(slice, input_shape=(96,96,3,5), output_shape=(96,96,3))(permuted)\n",
    "model=Model(inputs=[inp], outputs=[last_layer])\n",
    "\n",
    "model.compile(optimizer='adam', loss='mse', metrics=[perceptual_distance])\n",
    "\n",
    "model.fit_generator(my_generator(config.batch_size, train_dir),\n",
    "                    steps_per_epoch=steps_per_epoch//4,\n",
    "                    epochs=config.num_epochs, callbacks=[\n",
    "    ImageCallback(), WandbCallback()],\n",
    "    validation_steps=validation_steps//4,\n",
    "    validation_data=my_generator(config.batch_size, val_dir))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W&B Run: https://app.wandb.ai/l2k2/ml-class-examples_keras-video-predict/runs/izmh58q9\n",
      "Call `%%wandb` in the cell containing your training loop to display live results.\n",
      "Epoch 1/100\n",
      "52/52 [==============================] - 11s 221ms/step - loss: 0.0308 - perceptual_distance: 98.7534 - val_loss: 0.0142 - val_perceptual_distance: 57.7521\n",
      "Epoch 2/100\n",
      "52/52 [==============================] - 10s 187ms/step - loss: 0.0113 - perceptual_distance: 49.3992 - val_loss: 0.0107 - val_perceptual_distance: 46.4511\n",
      "Epoch 3/100\n",
      "52/52 [==============================] - 11s 207ms/step - loss: 0.0097 - perceptual_distance: 44.2018 - val_loss: 0.0082 - val_perceptual_distance: 41.2620\n",
      "Epoch 4/100\n",
      "52/52 [==============================] - 11s 210ms/step - loss: 0.0090 - perceptual_distance: 41.0019 - val_loss: 0.0066 - val_perceptual_distance: 35.8011\n",
      "Epoch 5/100\n",
      "52/52 [==============================] - 11s 208ms/step - loss: 0.0080 - perceptual_distance: 38.0702 - val_loss: 0.0077 - val_perceptual_distance: 36.3716\n",
      "Epoch 6/100\n",
      "52/52 [==============================] - 11s 209ms/step - loss: 0.0068 - perceptual_distance: 35.1312 - val_loss: 0.0054 - val_perceptual_distance: 31.3413\n",
      "Epoch 7/100\n",
      "52/52 [==============================] - 11s 206ms/step - loss: 0.0063 - perceptual_distance: 33.3940 - val_loss: 0.0079 - val_perceptual_distance: 35.5718\n",
      "Epoch 8/100\n",
      "52/52 [==============================] - 11s 208ms/step - loss: 0.0076 - perceptual_distance: 34.0418 - val_loss: 0.0062 - val_perceptual_distance: 35.1260\n",
      "Epoch 9/100\n",
      "52/52 [==============================] - 11s 211ms/step - loss: 0.0070 - perceptual_distance: 33.6120 - val_loss: 0.0056 - val_perceptual_distance: 30.3152\n",
      "Epoch 10/100\n",
      "52/52 [==============================] - 11s 208ms/step - loss: 0.0067 - perceptual_distance: 32.4787 - val_loss: 0.0049 - val_perceptual_distance: 27.8291\n",
      "Epoch 11/100\n",
      "52/52 [==============================] - 11s 209ms/step - loss: 0.0066 - perceptual_distance: 31.8789 - val_loss: 0.0053 - val_perceptual_distance: 31.7373\n",
      "Epoch 12/100\n",
      "52/52 [==============================] - 11s 209ms/step - loss: 0.0056 - perceptual_distance: 30.2554 - val_loss: 0.0052 - val_perceptual_distance: 27.0247\n",
      "Epoch 13/100\n",
      "52/52 [==============================] - 11s 212ms/step - loss: 0.0057 - perceptual_distance: 29.2055 - val_loss: 0.0064 - val_perceptual_distance: 31.2573\n",
      "Epoch 14/100\n",
      "52/52 [==============================] - 11s 208ms/step - loss: 0.0064 - perceptual_distance: 30.0778 - val_loss: 0.0082 - val_perceptual_distance: 30.1121\n",
      "Epoch 15/100\n",
      "52/52 [==============================] - 11s 213ms/step - loss: 0.0066 - perceptual_distance: 30.7880 - val_loss: 0.0052 - val_perceptual_distance: 27.1594\n",
      "Epoch 16/100\n",
      "52/52 [==============================] - 11s 209ms/step - loss: 0.0058 - perceptual_distance: 30.5703 - val_loss: 0.0054 - val_perceptual_distance: 27.0735\n",
      "Epoch 17/100\n",
      "52/52 [==============================] - 11s 208ms/step - loss: 0.0058 - perceptual_distance: 28.7904 - val_loss: 0.0046 - val_perceptual_distance: 26.3379\n",
      "Epoch 18/100\n",
      "52/52 [==============================] - 11s 212ms/step - loss: 0.0059 - perceptual_distance: 29.1845 - val_loss: 0.0059 - val_perceptual_distance: 31.8081\n",
      "Epoch 19/100\n",
      "52/52 [==============================] - 11s 213ms/step - loss: 0.0058 - perceptual_distance: 29.8545 - val_loss: 0.0051 - val_perceptual_distance: 26.1118\n",
      "Epoch 20/100\n",
      "52/52 [==============================] - 11s 212ms/step - loss: 0.0058 - perceptual_distance: 27.8370 - val_loss: 0.0043 - val_perceptual_distance: 24.8734\n",
      "Epoch 21/100\n",
      "52/52 [==============================] - 11s 207ms/step - loss: 0.0060 - perceptual_distance: 28.7893 - val_loss: 0.0059 - val_perceptual_distance: 27.6885\n",
      "Epoch 22/100\n",
      "52/52 [==============================] - 11s 213ms/step - loss: 0.0051 - perceptual_distance: 26.5802 - val_loss: 0.0049 - val_perceptual_distance: 25.6146\n",
      "Epoch 23/100\n",
      "52/52 [==============================] - 11s 206ms/step - loss: 0.0060 - perceptual_distance: 28.0869 - val_loss: 0.0043 - val_perceptual_distance: 27.7650\n",
      "Epoch 24/100\n",
      "52/52 [==============================] - 11s 212ms/step - loss: 0.0051 - perceptual_distance: 27.4193 - val_loss: 0.0045 - val_perceptual_distance: 24.2038\n",
      "Epoch 25/100\n",
      "52/52 [==============================] - 11s 208ms/step - loss: 0.0062 - perceptual_distance: 27.7622 - val_loss: 0.0044 - val_perceptual_distance: 24.8252\n",
      "Epoch 26/100\n",
      "52/52 [==============================] - 11s 206ms/step - loss: 0.0059 - perceptual_distance: 29.4451 - val_loss: 0.0079 - val_perceptual_distance: 29.5265\n",
      "Epoch 27/100\n",
      "52/52 [==============================] - 11s 208ms/step - loss: 0.0056 - perceptual_distance: 27.9719 - val_loss: 0.0050 - val_perceptual_distance: 28.9442\n",
      "Epoch 28/100\n",
      "52/52 [==============================] - 11s 209ms/step - loss: 0.0052 - perceptual_distance: 27.6330 - val_loss: 0.0040 - val_perceptual_distance: 22.7758\n",
      "Epoch 29/100\n",
      "52/52 [==============================] - 11s 211ms/step - loss: 0.0056 - perceptual_distance: 29.0150 - val_loss: 0.0055 - val_perceptual_distance: 26.1886\n",
      "Epoch 30/100\n",
      "52/52 [==============================] - 11s 208ms/step - loss: 0.0055 - perceptual_distance: 26.3779 - val_loss: 0.0048 - val_perceptual_distance: 30.4333\n",
      "Epoch 31/100\n",
      "52/52 [==============================] - 11s 207ms/step - loss: 0.0063 - perceptual_distance: 28.6932 - val_loss: 0.0049 - val_perceptual_distance: 26.6216\n",
      "Epoch 32/100\n",
      "11/52 [=====>........................] - ETA: 10s - loss: 0.0058 - perceptual_distance: 28.8208"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-90-94e9bf7f5021>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     28\u001b[0m     ImageCallback(), WandbCallback()],\n\u001b[1;32m     29\u001b[0m     \u001b[0mvalidation_steps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidation_steps\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 30\u001b[0;31m     validation_data=my_generator(config.batch_size, val_dir))\n\u001b[0m",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     89\u001b[0m                 warnings.warn('Update your `' + object_name + '` call to the ' +\n\u001b[1;32m     90\u001b[0m                               'Keras 2 API: ' + signature, stacklevel=2)\n\u001b[0;32m---> 91\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     92\u001b[0m         \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     93\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m   1416\u001b[0m             \u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1417\u001b[0m             \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1418\u001b[0;31m             initial_epoch=initial_epoch)\n\u001b[0m\u001b[1;32m   1419\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1420\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0minterfaces\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegacy_generator_methods_support\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training_generator.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m    179\u001b[0m             \u001b[0mbatch_index\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    180\u001b[0m             \u001b[0;32mwhile\u001b[0m \u001b[0msteps_done\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 181\u001b[0;31m                 \u001b[0mgenerator_output\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutput_generator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    183\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgenerator_output\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'__len__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/utils/data_utils.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    683\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    684\u001b[0m             \u001b[0;32mwhile\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_running\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 685\u001b[0;31m                 \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblock\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    686\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtask_done\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    687\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    662\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    663\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 664\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    665\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mready\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    666\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    659\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    660\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 661\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    662\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    663\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    549\u001b[0m             \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_flag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    550\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 551\u001b[0;31m                 \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    552\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    293\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m    \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    294\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 295\u001b[0;31m                 \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    296\u001b[0m                 \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    297\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# Conv3D\n",
    "\n",
    "from keras.layers import Lambda, Reshape, Permute, Input, add, Conv3D\n",
    "from keras.models import Model\n",
    "\n",
    "def slice(x):\n",
    "    return x[:,:,:,:, -1]\n",
    "\n",
    "hyperparams[\"num_epochs\"] = 100\n",
    "wandb.init(config=hyperparams)\n",
    "config = wandb.config\n",
    "\n",
    "inp = Input((config.height, config.width, 5 * 3))\n",
    "reshaped = Reshape((96,96,5,3))(inp)\n",
    "permuted = Permute((1,2,4,3))(reshaped)\n",
    "last_layer = Lambda(slice, input_shape=(96,96,3,5), output_shape=(96,96,3))(permuted)\n",
    "conv_output = Conv3D(1, (3,3,3), padding=\"same\")(permuted)\n",
    "conv_output_reshape = Reshape((96,96,3))(conv_output)\n",
    "combined = add([last_layer, conv_output_reshape])\n",
    "\n",
    "model=Model(inputs=[inp], outputs=[combined])\n",
    "\n",
    "model.compile(optimizer='adam', loss='mse', metrics=[perceptual_distance])\n",
    "\n",
    "model.fit_generator(my_generator(config.batch_size, train_dir),\n",
    "                    steps_per_epoch=steps_per_epoch//4,\n",
    "                    epochs=config.num_epochs, callbacks=[\n",
    "    ImageCallback(), WandbCallback()],\n",
    "    validation_steps=validation_steps//4,\n",
    "    validation_data=my_generator(config.batch_size, val_dir))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W&B Run: https://app.wandb.ai/l2k2/ml-class-examples_keras-video-predict/runs/b69epc6v\n",
      "Call `%%wandb` in the cell containing your training loop to display live results.\n",
      "Epoch 1/100\n",
      "52/52 [==============================] - 12s 221ms/step - loss: 0.0320 - perceptual_distance: 118.7155 - val_loss: 0.0097 - val_perceptual_distance: 42.7599\n",
      "Epoch 2/100\n",
      "52/52 [==============================] - 9s 180ms/step - loss: 0.0251 - perceptual_distance: 106.1317 - val_loss: 0.0064 - val_perceptual_distance: 35.6701\n",
      "Epoch 3/100\n",
      "52/52 [==============================] - 11s 212ms/step - loss: 0.0207 - perceptual_distance: 97.0222 - val_loss: 0.0071 - val_perceptual_distance: 33.8467\n",
      "Epoch 4/100\n",
      "52/52 [==============================] - 11s 213ms/step - loss: 0.0191 - perceptual_distance: 91.4583 - val_loss: 0.0058 - val_perceptual_distance: 31.4700\n",
      "Epoch 5/100\n",
      "52/52 [==============================] - 11s 220ms/step - loss: 0.0174 - perceptual_distance: 85.7698 - val_loss: 0.0078 - val_perceptual_distance: 33.1324\n",
      "Epoch 6/100\n",
      "52/52 [==============================] - 11s 217ms/step - loss: 0.0142 - perceptual_distance: 78.2606 - val_loss: 0.0062 - val_perceptual_distance: 30.2159\n",
      "Epoch 7/100\n",
      "52/52 [==============================] - 11s 210ms/step - loss: 0.0131 - perceptual_distance: 73.5458 - val_loss: 0.0068 - val_perceptual_distance: 34.0281\n",
      "Epoch 8/100\n",
      "52/52 [==============================] - 11s 207ms/step - loss: 0.0123 - perceptual_distance: 69.6759 - val_loss: 0.0049 - val_perceptual_distance: 27.8792\n",
      "Epoch 9/100\n",
      "52/52 [==============================] - 11s 206ms/step - loss: 0.0116 - perceptual_distance: 65.7430 - val_loss: 0.0049 - val_perceptual_distance: 27.5991\n",
      "Epoch 10/100\n",
      "52/52 [==============================] - 11s 206ms/step - loss: 0.0099 - perceptual_distance: 60.9869 - val_loss: 0.0042 - val_perceptual_distance: 26.8102\n",
      "Epoch 11/100\n",
      "52/52 [==============================] - 11s 209ms/step - loss: 0.0101 - perceptual_distance: 59.4733 - val_loss: 0.0046 - val_perceptual_distance: 28.4542\n",
      "Epoch 12/100\n",
      "52/52 [==============================] - 11s 209ms/step - loss: 0.0088 - perceptual_distance: 55.6481 - val_loss: 0.0042 - val_perceptual_distance: 25.8669\n",
      "Epoch 13/100\n",
      " 5/52 [=>............................] - ETA: 9s - loss: 0.0105 - perceptual_distance: 57.6925"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-92-eb8b26405d66>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     27\u001b[0m     ImageCallback(), WandbCallback()],\n\u001b[1;32m     28\u001b[0m     \u001b[0mvalidation_steps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidation_steps\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 29\u001b[0;31m     validation_data=my_generator(config.batch_size, val_dir))\n\u001b[0m",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     89\u001b[0m                 warnings.warn('Update your `' + object_name + '` call to the ' +\n\u001b[1;32m     90\u001b[0m                               'Keras 2 API: ' + signature, stacklevel=2)\n\u001b[0;32m---> 91\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     92\u001b[0m         \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     93\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m   1416\u001b[0m             \u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1417\u001b[0m             \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1418\u001b[0;31m             initial_epoch=initial_epoch)\n\u001b[0m\u001b[1;32m   1419\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1420\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0minterfaces\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegacy_generator_methods_support\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training_generator.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m    179\u001b[0m             \u001b[0mbatch_index\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    180\u001b[0m             \u001b[0;32mwhile\u001b[0m \u001b[0msteps_done\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 181\u001b[0;31m                 \u001b[0mgenerator_output\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutput_generator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    183\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgenerator_output\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'__len__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/utils/data_utils.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    683\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    684\u001b[0m             \u001b[0;32mwhile\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_running\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 685\u001b[0;31m                 \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mblock\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    686\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mqueue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtask_done\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    687\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0minputs\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    662\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    663\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 664\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    665\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mready\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    666\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    659\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    660\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 661\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    662\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    663\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    549\u001b[0m             \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_flag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    550\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 551\u001b[0;31m                 \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    552\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    553\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/lib/python3.6/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    293\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m    \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    294\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 295\u001b[0;31m                 \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    296\u001b[0m                 \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    297\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR:root:Invalid alias: The name clear can't be aliased because it is another magic command.\n",
      "ERROR:root:Invalid alias: The name more can't be aliased because it is another magic command.\n",
      "ERROR:root:Invalid alias: The name less can't be aliased because it is another magic command.\n",
      "ERROR:root:Invalid alias: The name man can't be aliased because it is another magic command.\n"
     ]
    }
   ],
   "source": [
    "# Conv3D with Gaussian Noise\n",
    "\n",
    "from keras.layers import Lambda, Reshape, Permute, Input, add, Conv3D, GaussianNoise\n",
    "from keras.models import Model\n",
    "\n",
    "def slice(x):\n",
    "    return x[:,:,:,:, -1]\n",
    "\n",
    "wandb.init()\n",
    "\n",
    "inp = Input((config.height, config.width, 5 * 3))\n",
    "reshaped = Reshape((96,96,5,3))(inp)\n",
    "permuted = Permute((1,2,4,3))(reshaped)\n",
    "noise = GaussianNoise(0.1)(permuted)\n",
    "last_layer = Lambda(slice, input_shape=(96,96,3,5), output_shape=(96,96,3))(noise)\n",
    "conv_output = Conv3D(1, (3,3,3), padding=\"same\")(noise)\n",
    "conv_output_reshape = Reshape((96,96,3))(conv_output)\n",
    "combined = add([last_layer, conv_output_reshape])\n",
    "\n",
    "model=Model(inputs=[inp], outputs=[combined])\n",
    "\n",
    "model.compile(optimizer='adam', loss='mse', metrics=[perceptual_distance])\n",
    "\n",
    "model.fit_generator(my_generator(config.batch_size, train_dir),\n",
    "                    steps_per_epoch=steps_per_epoch//4,\n",
    "                    epochs=config.num_epochs, callbacks=[\n",
    "    ImageCallback(), WandbCallback()],\n",
    "    validation_steps=validation_steps//4,\n",
    "    validation_data=my_generator(config.batch_size, val_dir))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/40\n",
      "52/52 [==============================] - 14s 265ms/step - loss: 0.0090 - perceptual_distance: 54.1361 - val_loss: 0.0038 - val_perceptual_distance: 25.8277\n",
      "Epoch 2/40\n",
      "52/52 [==============================] - 12s 239ms/step - loss: 0.0088 - perceptual_distance: 52.7034 - val_loss: 0.0049 - val_perceptual_distance: 27.9076\n",
      "Epoch 3/40\n",
      "52/52 [==============================] - 13s 253ms/step - loss: 0.0087 - perceptual_distance: 51.7484 - val_loss: 0.0053 - val_perceptual_distance: 28.5357\n",
      "Epoch 4/40\n",
      "52/52 [==============================] - 13s 251ms/step - loss: 0.0078 - perceptual_distance: 49.3450 - val_loss: 0.0044 - val_perceptual_distance: 25.3791\n",
      "Epoch 5/40\n",
      "52/52 [==============================] - 13s 252ms/step - loss: 0.0084 - perceptual_distance: 49.8420 - val_loss: 0.0048 - val_perceptual_distance: 26.8417\n",
      "Epoch 6/40\n",
      "52/52 [==============================] - 14s 265ms/step - loss: 0.0079 - perceptual_distance: 48.2071 - val_loss: 0.0041 - val_perceptual_distance: 27.0815\n",
      "Epoch 7/40\n",
      "52/52 [==============================] - 13s 252ms/step - loss: 0.0077 - perceptual_distance: 47.1554 - val_loss: 0.0051 - val_perceptual_distance: 28.9918\n",
      "Epoch 8/40\n",
      "12/52 [=====>........................] - ETA: 10s - loss: 0.0070 - perceptual_distance: 46.3427"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-10-328120765fc7>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     30\u001b[0m     ImageCallback(), WandbCallback()],\n\u001b[1;32m     31\u001b[0m     \u001b[0mvalidation_steps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidation_steps\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 32\u001b[0;31m     validation_data=my_generator(config.batch_size, val_dir))\n\u001b[0m",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     89\u001b[0m                 warnings.warn('Update your `' + object_name + '` call to the ' +\n\u001b[1;32m     90\u001b[0m                               'Keras 2 API: ' + signature, stacklevel=2)\n\u001b[0;32m---> 91\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     92\u001b[0m         \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     93\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m   1416\u001b[0m             \u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1417\u001b[0m             \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1418\u001b[0;31m             initial_epoch=initial_epoch)\n\u001b[0m\u001b[1;32m   1419\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1420\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0minterfaces\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegacy_generator_methods_support\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training_generator.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m    215\u001b[0m                 outs = model.train_on_batch(x, y,\n\u001b[1;32m    216\u001b[0m                                             \u001b[0msample_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample_weight\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m                                             class_weight=class_weight)\n\u001b[0m\u001b[1;32m    218\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    219\u001b[0m                 \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mto_list\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mtrain_on_batch\u001b[0;34m(self, x, y, sample_weight, class_weight)\u001b[0m\n\u001b[1;32m   1215\u001b[0m             \u001b[0mins\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0msample_weights\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1216\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_train_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1217\u001b[0;31m         \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1218\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0munpack_singleton\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1219\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m   2713\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_legacy_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2714\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2715\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2716\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2717\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mpy_any\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mis_tensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m   2673\u001b[0m             \u001b[0mfetched\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_callable_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marray_vals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_metadata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2674\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2675\u001b[0;31m             \u001b[0mfetched\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_callable_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marray_vals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2676\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mfetched\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2677\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1437\u001b[0m           ret = tf_session.TF_SessionRunCallable(\n\u001b[1;32m   1438\u001b[0m               \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_handle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatus\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1439\u001b[0;31m               run_metadata_ptr)\n\u001b[0m\u001b[1;32m   1440\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1441\u001b[0m           \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# Conv2DLSTM with Gaussian Noise\n",
    "\n",
    "from keras.layers import Lambda, Reshape, Permute, Input, add, Conv3D, GaussianNoise, ConvLSTM2D\n",
    "from keras.models import Model\n",
    "\n",
    "def slice(x):\n",
    "    return x[:,:,:,:, -1]\n",
    "\n",
    "wandb.init(config=hyperparams)\n",
    "config = wandb.config\n",
    "\n",
    "inp = Input((config.height, config.width, 5 * 3))\n",
    "reshaped = Reshape((96,96,5,3))(inp)\n",
    "permuted = Permute((1,2,4,3))(reshaped)\n",
    "noise = GaussianNoise(0.1)(permuted)\n",
    "last_layer = Lambda(slice, input_shape=(96,96,3,5), output_shape=(96,96,3))(noise)\n",
    "permuted_2 = Permute((4,1,2,3))(noise)\n",
    "\n",
    "conv_lstm_output_1 = ConvLSTM2D(6, (3,3), padding='same')(permuted_2)\n",
    "conv_output = Conv2D(3, (3,3), padding=\"same\")(conv_lstm_output_1)\n",
    "combined = add([last_layer, conv_output])\n",
    "\n",
    "model=Model(inputs=[inp], outputs=[combined])\n",
    "\n",
    "model.compile(optimizer='adam', loss='mse', metrics=[perceptual_distance])\n",
    "\n",
    "model.fit_generator(my_generator(config.batch_size, train_dir),\n",
    "                    steps_per_epoch=steps_per_epoch//4,\n",
    "                    epochs=config.num_epochs, callbacks=[\n",
    "    ImageCallback(), WandbCallback()],\n",
    "    validation_steps=validation_steps//4,\n",
    "    validation_data=my_generator(config.batch_size, val_dir))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W&B Run: https://app.wandb.ai/l2k2/ml-class-examples_keras-video-predict/runs/pa5thspf\n",
      "Call `%%wandb` in the cell containing your training loop to display live results.\n",
      "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n",
      "Epoch 1/10\n",
      " 3/52 [>.............................] - ETA: 2:56 - loss: 0.6657 - perceptual_distance: 519.0305"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-11-148f823e326c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     55\u001b[0m     ImageCallback(), WandbCallback()],\n\u001b[1;32m     56\u001b[0m     \u001b[0mvalidation_steps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidation_steps\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 57\u001b[0;31m     validation_data=my_generator(config.batch_size, val_dir))\n\u001b[0m",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     89\u001b[0m                 warnings.warn('Update your `' + object_name + '` call to the ' +\n\u001b[1;32m     90\u001b[0m                               'Keras 2 API: ' + signature, stacklevel=2)\n\u001b[0;32m---> 91\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     92\u001b[0m         \u001b[0mwrapper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     93\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m   1416\u001b[0m             \u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse_multiprocessing\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1417\u001b[0m             \u001b[0mshuffle\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1418\u001b[0;31m             initial_epoch=initial_epoch)\n\u001b[0m\u001b[1;32m   1419\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1420\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0minterfaces\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegacy_generator_methods_support\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training_generator.py\u001b[0m in \u001b[0;36mfit_generator\u001b[0;34m(model, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)\u001b[0m\n\u001b[1;32m    215\u001b[0m                 outs = model.train_on_batch(x, y,\n\u001b[1;32m    216\u001b[0m                                             \u001b[0msample_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample_weight\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m                                             class_weight=class_weight)\n\u001b[0m\u001b[1;32m    218\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    219\u001b[0m                 \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mto_list\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mtrain_on_batch\u001b[0;34m(self, x, y, sample_weight, class_weight)\u001b[0m\n\u001b[1;32m   1215\u001b[0m             \u001b[0mins\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0msample_weights\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1216\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_train_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1217\u001b[0;31m         \u001b[0moutputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1218\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0munpack_singleton\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1219\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m   2713\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_legacy_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2714\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2715\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2716\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2717\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mpy_any\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mis_tensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m   2673\u001b[0m             \u001b[0mfetched\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_callable_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marray_vals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_metadata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2674\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2675\u001b[0;31m             \u001b[0mfetched\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_callable_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marray_vals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2676\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mfetched\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2677\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1437\u001b[0m           ret = tf_session.TF_SessionRunCallable(\n\u001b[1;32m   1438\u001b[0m               \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_handle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatus\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1439\u001b[0;31m               run_metadata_ptr)\n\u001b[0m\u001b[1;32m   1440\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1441\u001b[0m           \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# Conv2DLSTM with Gaussian Noise\n",
    "\n",
    "from keras.layers import Lambda, Reshape, Permute, Input, add, Conv3D, GaussianNoise, concatenate\n",
    "from keras.layers import ConvLSTM2D, BatchNormalization, TimeDistributed, Add\n",
    "from keras.models import Model\n",
    "\n",
    "def slice(x):\n",
    "    return x[:,:,:,:, -1]\n",
    "\n",
    "wandb.init(config=hyperparams)\n",
    "config = wandb.config\n",
    "\n",
    "c=4\n",
    "\n",
    "inp = Input((config.height, config.width, 5 * 3))\n",
    "reshaped = Reshape((96,96,5,3))(inp)\n",
    "permuted = Permute((1,2,4,3))(reshaped)\n",
    "noise = GaussianNoise(0.1)(permuted)\n",
    "last_layer = Lambda(slice, input_shape=(96,96,3,5), output_shape=(96,96,3))(noise)\n",
    "x = Permute((4,1,2,3))(noise)\n",
    "x =(ConvLSTM2D(filters=c, kernel_size=(3,3),padding='same',name='conv_lstm1', return_sequences=True))(x)\n",
    "\n",
    "c1=(BatchNormalization())(x)\n",
    "x = Dropout(0.2)(x)\n",
    "x =(TimeDistributed(MaxPooling2D(pool_size=(2,2))))(c1)\n",
    "\n",
    "x =(ConvLSTM2D(filters=2*c,kernel_size=(3,3),padding='same',name='conv_lstm3',return_sequences=True))(x)\n",
    "c2=(BatchNormalization())(x)\n",
    "x = Dropout(0.2)(x)\n",
    "\n",
    "x =(TimeDistributed(MaxPooling2D(pool_size=(2,2))))(c2)\n",
    "x =(ConvLSTM2D(filters=4*c,kernel_size=(3,3),padding='same',name='conv_lstm4',return_sequences=True))(x)\n",
    "\n",
    "x =(TimeDistributed(UpSampling2D(size=(2, 2))))(x)\n",
    "x =(ConvLSTM2D(filters=4*c,kernel_size=(3,3),padding='same',name='conv_lstm5',return_sequences=True))(x)\n",
    "x =(BatchNormalization())(x)\n",
    "\n",
    "x =(ConvLSTM2D(filters=2*c,kernel_size=(3,3),padding='same',name='conv_lstm6',return_sequences=True))(x)\n",
    "x =(BatchNormalization())(x)\n",
    "x = Add()([c2, x])\n",
    "x = Dropout(0.2)(x)\n",
    "\n",
    "x =(TimeDistributed(UpSampling2D(size=(2, 2))))(x)\n",
    "x =(ConvLSTM2D(filters=c,kernel_size=(3,3),padding='same',name='conv_lstm7',return_sequences=False))(x)\n",
    "x =(BatchNormalization())(x)\n",
    "combined = concatenate([last_layer, x])\n",
    "combined = Conv2D(3, (1,1))(combined)\n",
    "model=Model(inputs=[inp], outputs=[combined])\n",
    "\n",
    "model.compile(optimizer='adam', loss='mse', metrics=[perceptual_distance])\n",
    "\n",
    "model.fit_generator(my_generator(config.batch_size, train_dir),\n",
    "                    steps_per_epoch=steps_per_epoch//4,\n",
    "                    epochs=config.num_epochs, callbacks=[\n",
    "    ImageCallback(), WandbCallback()],\n",
    "    validation_steps=validation_steps//4,\n",
    "    validation_data=my_generator(config.batch_size, val_dir))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
